Don't assume all segments audio and video track start at the same time point. Audio track and video tracks have under most cases a different start and end time. Additionally, the mp4 file is poorly muxed and contains out of order frames. As such we keep a table of time and duration for each media segments. The test itself was right, however it had an invalid time table to start with as it incorrectly used the dts (decode timestamp) instead of the pts (presentation timestamp). MozReview-Commit-ID: G2uwK3rroj3 Upstreamed from https://bugzilla.mozilla.org/show_bug.cgi?id=1293613 
diff --git a/media-source/mediasource-sequencemode-append-buffer.html b/media-source/mediasource-sequencemode-append-buffer.html index ee8293d..808c597 100644 --- a/media-source/mediasource-sequencemode-append-buffer.html +++ b/media-source/mediasource-sequencemode-append-buffer.html 
@@ -82,45 +82,55 @@    mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)  { - assert_equals(segmentInfo.media[0].timecode, 0, "segment starts at time 0"); + var offset = Math.min(segmentInfo.media[0].timev, segmentInfo.media[0].timea); + var expectedStart = Math.max(segmentInfo.media[0].timev, segmentInfo.media[0].timea) - offset; + var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset; + var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) - offset;  append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()  {  verify_offset_and_buffered(test, mediaSource, sourceBuffer, - 0, 0, - segmentInfo.media[1].timecode + sourceBuffer.timestampOffset, - segmentInfo.media[0].highest_end_time + sourceBuffer.timestampOffset, + -offset, expectedStart, + expectedEnd, expectedEndEOS,  test.done);  });  }, "Test sequence AppendMode appendBuffer(first media segment)");    mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)  { - assert_greater_than(segmentInfo.media[1].timecode, 0, "segment starts after time 0"); + var offset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea); + var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - offset; + var expectedEnd = Math.min(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset; + var expectedEndEOS = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - offset; + assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0, + "segment starts after time 0");  append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()  {  verify_offset_and_buffered(test, mediaSource, sourceBuffer, - -segmentInfo.media[1].timecode, 0, - segmentInfo.media[2].timecode + sourceBuffer.timestampOffset, - segmentInfo.media[1].highest_end_time + sourceBuffer.timestampOffset, + -offset, expectedStart, + expectedEnd, expectedEndEOS,  test.done);  });  }, "Test sequence AppendMode appendBuffer(second media segment)");    mediasource_sequencemode_test(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)  { - assert_greater_than(segmentInfo.media[1].timecode, 0, "segment starts after time 0"); + assert_greater_than(Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea), 0, + "segment starts after time 0");  append_segment(test, sourceBuffer, mediaData, segmentInfo.media[1], function()  { - assert_equals(segmentInfo.media[0].timecode, 0, "segment starts at time 0");  append_segment(test, sourceBuffer, mediaData, segmentInfo.media[0], function()  { + var firstOffset = Math.min(segmentInfo.media[1].timev, segmentInfo.media[1].timea); + var secondOffset = Math.max(segmentInfo.media[1].endtimev, segmentInfo.media[1].endtimea) - firstOffset; + var expectedStart = Math.max(segmentInfo.media[1].timev, segmentInfo.media[1].timea) - firstOffset; + var expectedEnd = Math.min(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset; + var expectedEndEOS = Math.max(segmentInfo.media[0].endtimev, segmentInfo.media[0].endtimea) + secondOffset;  // Current timestampOffset should reflect offset required to put media[0]  // immediately after media[1]'s highest frame end timestamp (as was adjusted  // by an earlier timestampOffset).  verify_offset_and_buffered(test, mediaSource, sourceBuffer, - segmentInfo.media[1].highest_end_time - segmentInfo.media[1].timecode, 0, - segmentInfo.media[1].timecode + sourceBuffer.timestampOffset, - segmentInfo.media[0].highest_end_time + sourceBuffer.timestampOffset, + secondOffset, expectedStart, + expectedEnd, expectedEndEOS,  test.done);  })  });